package br.com.manutencao.managedbeans;

import java.io.Serializable;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.model.SelectItem;

import br.com.manutencao.entities.Chamado;
import br.com.manutencao.entities.Funcionario;
import br.com.manutencao.entities.Maquina;

import br.com.manutencao.entities.TipoDefeito;
import br.com.manutencao.repositories.ChamadoRepository;
import br.com.manutencao.repositories.Repository;
import br.com.manutencao.repositories.MaquinaRepository;
import br.com.manutencao.repositories.TipoDefeitoRepository;

@ManagedBean(name = "chamado")
public class ChamadoBean implements Serializable {

	private static final long serialVersionUID = 1L;

	private ChamadoRepository chamadoRepositoty;

	private MaquinaRepository maquinaRepository;;

	private Repository<Funcionario> funcionarioRepository;

	private TipoDefeitoRepository tipoDefeitoRepository;

	private List<Chamado> tabelaChamados;

	private List<Chamado> tabelaChamadosOpen;

	private Chamado chamado = new Chamado();

	private Date abertura;

	private Date fechamento;

	private TipoDefeito tipoDefeito = new TipoDefeito();

	private Maquina maquina = new Maquina();

	private Funcionario funcionario = new Funcionario();

	private Integer funcionario2;

	private Integer maquina2;

	private Integer idDefeito;
	
	private Integer idChamado;

	private String descricao;

	private Collection<SelectItem> funcionarios;

	private Collection<SelectItem> maquinas;

	private Collection<SelectItem> tipoDefeitos;

	public String salvaChamado() {

		chamadoRepositoty = new ChamadoRepository();

		tipoDefeitoRepository = new TipoDefeitoRepository();

		funcionarioRepository = new Repository<Funcionario>(Funcionario.class);

		maquinaRepository = new MaquinaRepository();

		Chamado chamado = new Chamado();

		chamado.setDescricao(descricao);

		chamado.setAbertura(abertura);

		chamado.setFechamento(fechamento);

		tipoDefeito = tipoDefeitoRepository.buscaPorId(idDefeito);
		chamado.setTipoDefeito(tipoDefeito);

		funcionario = funcionarioRepository.buscaPorId(funcionario2);
		chamado.setFuncionario(funcionario);

		maquina = maquinaRepository.buscaPorId(maquina2);
		chamado.setMaquina(maquina);

		chamadoRepositoty.adiciona(chamado);

		chamadoRepositoty = null;

		tipoDefeitoRepository = null;

		funcionarioRepository = null;

		maquinaRepository = null;

		return "chamado-success";
	}

	// getters and setters

	
	
	public TipoDefeito getTipoDefeito() {
		return tipoDefeito;
	}

	public Integer getIdChamado() {
		return idChamado;
	}

	public void setIdChamado(Integer idChamado) {
		this.idChamado = idChamado;
	}

	public void setTipoDefeito(TipoDefeito tipoDefeito) {
		this.tipoDefeito = tipoDefeito;
	}

	public String getDescricao() {
		return descricao;
	}

	public Integer getFuncionario2() {
		return funcionario2;
	}

	public void setFuncionario2(Integer funcionario2) {
		this.funcionario2 = funcionario2;
	}

	public Integer getMaquina2() {
		return maquina2;
	}

	public void setMaquina2(Integer maquina2) {
		this.maquina2 = maquina2;
	}

	public Integer getIdDefeito() {
		return idDefeito;
	}

	public void setIdDefeito(Integer idDefeito) {
		this.idDefeito = idDefeito;
	}

	public void setIdDefeitos(Integer IdDefeito) {
		this.idDefeito = IdDefeito;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public Date getAbertura() {
		return abertura;
	}

	public void setAbertura(Date abertura) {
		this.abertura = abertura;
	}

	public Date getFechamento() {
		return fechamento;
	}

	public void setFechamento(Date fechamento) {
		this.fechamento = fechamento;
	}

	public void setMaquina(Maquina maquina) {
		this.maquina = maquina;
	}

	public void setFuncionario(Funcionario funcionario) {
		this.funcionario = funcionario;
	}

	public Funcionario getFuncionario() {
		return funcionario;
	}

	public Maquina getMaquina() {
		return maquina;
	}

	public void setFuncionarios(Collection<SelectItem> funcionarios) {
		this.funcionarios = funcionarios;
	}

	public Collection<SelectItem> getFuncionarios() {
		Collection<SelectItem> funcionarioSelect = new ArrayList<SelectItem>();

		funcionarioRepository = new Repository<Funcionario>(Funcionario.class);

		Collection<Funcionario> funcionarios = funcionarioRepository
				.buscaTodos();
		for (Funcionario funcionario : funcionarios) {
			SelectItem select = new SelectItem();
			select.setLabel(funcionario.getNome());
			select.setValue(funcionario.getId());
			funcionarioSelect.add(select);
		}

		funcionarioRepository = null;

		return funcionarioSelect;
	}

	public void setMaquinas(Collection<SelectItem> maquinas) {
		this.maquinas = maquinas;
	}

	public Collection<SelectItem> getMaquinas() {
		Collection<SelectItem> maquinaSelect = new ArrayList<SelectItem>();

		maquinaRepository = new MaquinaRepository();

		Collection<Maquina> maquinas = maquinaRepository.buscaTodos();
		for (Maquina maquina : maquinas) {
			SelectItem select = new SelectItem();
			select.setLabel(maquina.getNome());
			select.setValue(maquina.getId());
			maquinaSelect.add(select);
		}

		maquinaRepository = null;

		return maquinaSelect;
	}

	public void setTipoDefeitos(Collection<SelectItem> tipoDefeitos) {
		this.tipoDefeitos = tipoDefeitos;
	}

	public Collection<SelectItem> getTipoDefeitos() {
		Collection<SelectItem> tipoDefeitoSelect = new ArrayList<SelectItem>();

		tipoDefeitoRepository = new TipoDefeitoRepository();

		Collection<TipoDefeito> tipoDefeitos = tipoDefeitoRepository
				.buscaTodos();
		for (TipoDefeito tipoDefeito : tipoDefeitos) {
			SelectItem select = new SelectItem();
			select.setLabel(tipoDefeito.getNome());
			select.setValue(tipoDefeito.getId());
			tipoDefeitoSelect.add(select);
		}

		tipoDefeitoRepository = null;

		return tipoDefeitoSelect;
	}

	public List<Chamado> getTabelaChamados() {
		chamadoRepositoty = new ChamadoRepository();
		tabelaChamados = (List<Chamado>) chamadoRepositoty.buscaTodos();
		chamadoRepositoty = null;

		return tabelaChamados;
	}

	public void setTabelaChamados(List<Chamado> tabelaChamados) {
		this.tabelaChamados = tabelaChamados;
	}

	public List<Chamado> getTabelaChamadosOpen() {
		chamadoRepositoty = new ChamadoRepository();
		tabelaChamadosOpen = (List<Chamado>) chamadoRepositoty.buscaTodosOpen();
		chamadoRepositoty = null;

		return tabelaChamadosOpen;
	}

	public void setTabelaChamadosOpen(List<Chamado> tabelaChamadosOpen) {
		this.tabelaChamadosOpen = tabelaChamadosOpen;
	}

	public String alteraAction() {

		chamado = chamadoRepositoty.buscaPorId(idChamado);
		
		chamado.setFechamento(fechamento);
		
		chamadoRepositoty.altera(chamado);

		return "chamado-success";
	}

}
